#include "includes.h"

// UCOSIII核心函数空实现

void OSInit(OS_ERR *p_err) {
    if(p_err) *p_err = OS_ERR_NONE;
}

void OS_CRITICAL_ENTER(void) {
    // 空实现
}

void OS_CRITICAL_EXIT(void) {
    // 空实现
}

void OSStart(OS_ERR *p_err) {
    if(p_err) *p_err = OS_ERR_NONE;
}

void CPU_Init(void) {
    // 空实现
}

void OSStatTaskCPUUsageInit(OS_ERR *p_err) {
    if(p_err) *p_err = OS_ERR_NONE;
}

void OSSchedRoundRobinCfg(CPU_BOOLEAN en, CPU_INT16U rnd_robin_quad_tick, OS_ERR *p_err) {
    if(p_err) *p_err = OS_ERR_NONE;
}

void OSSemCreate(OS_SEM *p_sem, CPU_CHAR *p_name, OS_SEM_CTR cnt, OS_ERR *p_err) {
    if(p_sem) p_sem->Ctr = cnt;
    if(p_name && p_sem) strncpy(p_sem->Name, p_name, 15);
    if(p_err) *p_err = OS_ERR_NONE;
}

void OSTaskCreate(OS_TCB *p_tcb, CPU_CHAR *p_name, OS_TASK_PTR p_task, void *p_arg, 
                 OS_PRIO prio, CPU_STK *p_stk_base, CPU_STK_SIZE stk_limit, 
                 CPU_STK_SIZE stk_size, OS_MSG_QTY q_size, OS_TICK time_quanta, 
                 void *p_ext, OS_OPT opt, OS_ERR *p_err) {
    // 简单初始化TCB
    if(p_tcb) {
        p_tcb->StkPtr = p_stk_base;
        p_tcb->StkSize = stk_size;
        p_tcb->Prio = prio;
        if(p_name) strncpy(p_tcb->Name, p_name, 15);
    }
    if(p_err) *p_err = OS_ERR_NONE;
}

void OSTaskSuspend(OS_TCB *p_tcb, OS_ERR *p_err) {
    if(p_err) *p_err = OS_ERR_NONE;
}

void OSTaskResume(OS_TCB *p_tcb, OS_ERR *p_err) {
    if(p_err) *p_err = OS_ERR_NONE;
}

void OSTaskDel(OS_TCB *p_tcb, OS_ERR *p_err) {
    if(p_err) *p_err = OS_ERR_NONE;
}

void OSTimeDlyHMSM(CPU_INT08U hours, CPU_INT08U minutes, CPU_INT08U seconds, CPU_INT16U milli, CPU_INT08U opt, OS_ERR *p_err) {
    // 使用STM32延时函数替代
    unsigned int totalMs = (hours * 3600 + minutes * 60 + seconds) * 1000 + milli;
    
    // 调用现有的delay_ms函数（假设存在）
    extern void delay_ms(unsigned int ms);
    delay_ms(totalMs);
    
    if(p_err) *p_err = OS_ERR_NONE;
}

OS_ERR OSSemPend(OS_SEM *p_sem, CPU_INT32U timeout, CPU_INT08U opt, void *p_ts, OS_ERR *p_err) {
    if(p_sem && p_sem->Ctr > 0) {
        p_sem->Ctr--;
        if(p_err) *p_err = OS_ERR_NONE;
        return OS_ERR_NONE;
    }
    
    // 非阻塞模式下直接返回
    if(opt == OS_OPT_PEND_NON_BLOCKING) {
        if(p_err) *p_err = 1; // 返回一个非零错误码
        return 1;
    }
    
    // 阻塞模式下等待一小段时间后返回
    extern void delay_ms(unsigned int ms);
    delay_ms(10);
    
    if(p_err) *p_err = OS_ERR_NONE;
    return OS_ERR_NONE;
}

void OSSemPost(OS_SEM *p_sem, CPU_INT08U opt, OS_ERR *p_err) {
    if(p_sem) p_sem->Ctr++;
    if(p_err) *p_err = OS_ERR_NONE;
} 